﻿Imports System.Net.Mail
Imports System.Net
Imports System.Net.Sockets

Imports System.Data
Imports System.Text

Imports System.ComponentModel 
Imports System.Collections.ObjectModel  



Public Class CSGeneralEvioCartas

Private const __CALCULO_EN_MEGAS_DIVISOR__        As Double  = 1000000
Private Const __NUM_ARCHIVOS_DEFAULT__            As Byte    = 1 
Private Const __TAMANO_ARCHIVOS_DEFAULT_MGBYTE__  As Double  = 10
Private Const __PUERTO_SMTP_DEFAULT__             As Integer = 25

Private   NUM_ARCHIVO_ADJUNTOS_PERMITIDOS As Byte
Private   TAMANO_MAXIMO_ARCHIVOS_ADJUNTOS As Double  
Private   REMITENTE                       As String 
Private   SUBJECT                         As String
Private   BODY_SPA                        As String 
Private   BODY_ENG                        As String 
Private   SERVIDOR_SMTP                   As String 
Private   PUERTO_SMTP                     As integer



Public Sub new()


'1.Obtener parámetros de validación y direcciones de correo correspondientes al intermediario
  Try
     NUM_ARCHIVO_ADJUNTOS_PERMITIDOS =  Convert.ToByte ( CServicioLocalSQLServerDB.ObtenerNumMaxArchivosAdjuntos ())
     TAMANO_MAXIMO_ARCHIVOS_ADJUNTOS =  Convert.ToDouble (  CServicioLocalSQLServerDB.ObtenerTamanoMaxTotalArchivosAdjuntos ())
  Catch ex As Exception
     NUM_ARCHIVO_ADJUNTOS_PERMITIDOS = __NUM_ARCHIVOS_DEFAULT__
     TAMANO_MAXIMO_ARCHIVOS_ADJUNTOS = __TAMANO_ARCHIVOS_DEFAULT_MGBYTE__
  End Try
  


  '2. Datos del servidor
   SERVIDOR_SMTP = CServicioLocalSQLServerDB.ObtenerSERVIDORSMTP ()   
   Try
     PUERTO_SMTP   = Convert.ToInt16( CServicioLocalSQLServerDB.ObtenerPUERTOSMTP())
   Catch ex As Exception
     PUERTO_SMTP = __PUERTO_SMTP_DEFAULT__
   End Try
      


  '3. Obtener datos del correo 
   REMITENTE = CServicioLocalSQLServerDB.ObtenerDireccionMailRemitente ()
   SUBJECT   = CServicioLocalSQLServerDB.ObtenerSubjectGenerico ()
   BODY_SPA  = CServicioLocalSQLServerDB.ObtenerBodyGenericoSPA()
   BODY_ENG  = CServicioLocalSQLServerDB.ObtenerBodyGenericoENG()
  
End Sub

Public Function ObtieneCartasHistoricas(ByVal fechaSolicitud As Date, ByVal TVNg As String) As List(Of CTEnvioCarta)
    Try
            Dim lista        As New List(Of CTEnvioCarta)
            Dim dtDatos      As DataTable = CFLServicioLocalSQLServerDB.ObtieneCartasHistoricas(fechaSolicitud, TVNg)
            Dim ec           As CTEnvioCarta

            If dtDatos.Rows.Count > 0 Then
                For Each dt As DataRow In dtDatos.Rows
                    ec = New CTEnvioCarta()
                    
                    With ec       
                        .IdPs             = Convert.ToInt32(dt("ID_PARTIDA_PS"))
                        .IdTvNg           = Convert.ToInt32(dt("ID_TV_NG"))
                        .TvNg             = Convert.ToString(dt("TV_NG"))
                        .CantidadActual   = Convert.ToDouble(dt("CANTIDAD_ACTUAL"))
                        .IdPej            = Convert.ToInt32(dt("ID_PARTIDA_EJ"))
                        .SecDistrib       = Convert.ToInt32(dt("SEC_DISTRIB"))
                        .IdIntermediario  = Convert.ToInt32(dt("ID_INTER"))
                        .Intermediario    = Convert.ToString(dt("INTER"))
                        .Tasa             = Convert.ToDouble(dt("TASA"))
                        .FechaSolicitud   = Convert.ToDateTime(dt("FEC_SOLICITUD"))
                        .FechaLiquidacion = Convert.ToDateTime(dt("FEC_LIQUIDACION"))
                        .Monto            = Convert.ToDouble(dt("CANTIDAD_DISTRIBUIDA"))
                        .Estatus          = Convert.ToString(dt("ESTATUS"))
                        .FechaUltimoEnvio = Convert.ToString(dt("FECHA_ENV"))
                        .Plazo            = Convert.ToInt32(dt("PLAZO"))
                        .FolioDecalog     = Convert.ToString(dt("FOLIO_ORDEN"))
                    End With
                    lista.Add(ec)
                    ec = Nothing
                Next
            End If

            Return lista
        Catch ex As Exception                
            Throw ex
        End Try        

End Function

Public Function ObtieneNombreCarta() As String
    Try
        Dim nombre = CServicioLocalSQLServerDB.ObtenerParametro(67)
        Return nombre
    Catch ex As Exception
        Throw ex
    End Try
End Function

Public Function ObtieneRutaCarta() As String
    Try
        Dim ruta = CServicioLocalSQLServerDB.ObtenerParametro(68)
        Return ruta
    Catch ex As Exception
        Throw ex
    End Try
End Function

Public Function ObtieneDetalleCarta(ByVal idPej As Long, ByVal secuencia As Long, ByVal idIntermediario As Long) As List(Of CTDetalleCarta)
    Try
        Dim lista As List(Of CTDetalleCarta) = New List(Of CTDetalleCarta)()

        Dim dtDatos      As DataTable = CFLServicioLocalSQLServerDB.ObtieneDetalleCarta(idPej, secuencia, idIntermediario)
        Dim dc           As CTDetalleCarta

        If dtDatos.Rows.Count > 0 Then
            For Each dt As DataRow In dtDatos.Rows
                dc = New CTDetalleCarta()
                    
                With dc       
                    .Fondo            = Convert.ToString(dt("FONDO"))
                    .Cantidad         = Convert.ToDouble(dt("CANTIDAD"))
                    .CtoIndeval       = Convert.ToString(dt("CTO_INDEVAL"))
                    .CtoIntermediario = Convert.ToString(dt("CTO_INTERMEDIARIO"))
                    
                End With
                lista.Add(dc)
                dc = Nothing
            Next
        End If

        Return lista
    Catch ex As Exception
        Throw ex
    End Try
End Function


Public Function ActualizaCarta(ByVal idPej As Integer, ByVal secuencia As Integer) As Boolean
    Dim sMsgError As String = ""
    If CFLServicioLocalSQLServerDB.ActualizaCarta(idPej, secuencia, sMsgError) = False Then
        Throw New Exception(sMsgError)
    End If
    Return True
End Function

Public function EnviarAutoCartaAIntermediarioEtAl(ByVal idIntermediario As Integer,    ByRef DocAdjuntos As List(Of String), ByRef estado As List(Of  CTEstadoOperacionGral)) As Boolean 

Dim direccionesMail = New List(Of String)
Dim sMsgError As String = ""

Dim mensaje      As MailMessage  = Nothing 
Dim clienteSMTP  As SmtpClient  = Nothing 




 '1. Validación de límites (1)

  If DocAdjuntos.Count > NUM_ARCHIVO_ADJUNTOS_PERMITIDOS then 
     estado.Add (New CTEstadoOperacionGral(1, "El número de archivos adjuntos debe ser menor o igual a " & NUM_ARCHIVO_ADJUNTOS_PERMITIDOS & "."))     
     Return False 
  End If
   

  '2. Validar el tamaño total de archivos adjuntos 

   Dim tamanoArchivosAdjuntos As Double = 0 
 
   For Each archivo As String In DocAdjuntos 
       Dim infoFile As System.IO.FileInfo      
        infoFile = My.Computer.FileSystem.GetFileInfo (archivo) 
        tamanoArchivosAdjuntos += (infoFile.Length  /__CALCULO_EN_MEGAS_DIVISOR__ )
        If tamanoArchivosAdjuntos > TAMANO_MAXIMO_ARCHIVOS_ADJUNTOS  then 
           estado.Add (New CTEstadoOperacionGral(2, "El tamaño total de los archivos adjuntos debe ser menor o igual a " & TAMANO_MAXIMO_ARCHIVOS_ADJUNTOS  & " MegaBytes."))     
           Return False 
        End If

   Next



   '3) Obtener direcciones de correo electrónico de los destinatarios para el intermediario en proceso
    
    direccionesMail = CFLServicioLocalSQLServerDB.ObtenerDireccionesMailXIntermediario(idIntermediario,sMsgError) 
    If Not sMsgError.Equals ("") then 
       estado.Add (New CTEstadoOperacionGral(3, "No se pudo obtener las direcciones de correo electrónico: " & sMsgError))     
       Return False 
    End If


    Try

    '4) Generar el Mensaje

      'SE CREA EL MENSAJE
       mensaje = New MailMessage()

      'REMITENTE
       Dim [De] As New MailAddress(REMITENTE) 
       mensaje.From = [De]

       'DESTINATARIOS

        For Each Destinatario as String In direccionesMail
          mensaje.To.Add (Destinatario) 
        Next

        'SUBJECT 
        mensaje.Subject = SUBJECT

        'BODY
        If BODY_ENG.Length = 0 Then
            mensaje.Body = BODY_SPA
        Else
            mensaje.Body = BODY_SPA _
                           & vbCrLf & vbCrLf & _
                           "----------------------------------------------------------------------------------------------------------------------------------------------------------" _
                           & vbCrLf & vbCrLf & _
                           BODY_ENG
        End If
        


        'ARCHIVOS ADJUNTOS 
         For Each archivoAtt As String In DocAdjuntos                                                
            mensaje.Attachments.Add (New  Mail.Attachment   (archivoAtt)) 
         Next

         
         'POSIBLE: AGREGAR IP DEL QUE ENVIO. 


      '5) CREACION DEL CLIENTE SMTP
          clienteSMTP = New SmtpClient(SERVIDOR_SMTP, PUERTO_SMTP)

                
       '6) ENVIO DEL MENSAJE         
         
            clienteSMTP.Send(mensaje)   
              
                      
         Catch ex As Exception
             estado.Add (New CTEstadoOperacionGral(4, "Error al enviar el correo:  " & ex.Message))        
             Return False         
         Finally
                 
           If not mensaje is Nothing then 
              mensaje.Dispose ()
           End If

           If Not clienteSMTP is Nothing then 
              clienteSMTP.Dispose ()                    
           End If
                                               
         End Try
        

   Return True 


End Function 



End Class
